package msgdef

import (
	"bytes"
	"encoding/binary"
	"fmt"
	"src/zeus/bytestream"
)

/*
	msgdef 包下面主要定义二进制消息流
	由于二进制消息流个数固定，所以在代码中直接定义，序列化和反序列化
*/

// ClientVerifyReq 验证消息
type ClientVerifyReq struct {
	// Source: 消息来源, 分客户端或者服务器(ClientMSG/服务器类型)
	Source uint8 //data[0]
	// UID: 玩家UID或者服务器ID
	PID uint64 //data[1:9]
	// Token: 客户端登录时需要携带Token
	Token string //data[9:41]
	// SessState: 客户端登录时需要传送当前状态
	SessState uint8
}

func (msg *ClientVerifyReq) GetSource() uint8 {
	return msg.Source
}

func (msg *ClientVerifyReq) GetSessVerifyPID() uint64 {
	return msg.PID
}

func (msg *ClientVerifyReq) GetSessState() uint8 {
	return msg.SessState
}

func (msg *ClientVerifyReq) String() string {
	return fmt.Sprintf("%+v", *msg)
}

func (msg *ClientVerifyReq) GetSessSToken() string {
	return msg.Token
}

// Name 消息名
func (msg *ClientVerifyReq) Name() string {
	return "ClientVerifyReq"
}

// MarshalTo 序列化
func (msg *ClientVerifyReq) MarshalTo(data []byte) (n int, err error) {
	bw := bytestream.NewByteStream(data)
	return msg.Size(), bw.Marshal(msg)
}

// Unmarshal 反序列化
func (msg *ClientVerifyReq) Unmarshal(data []byte) error {

	sw := bytestream.NewByteStream(data)
	msg.Source, _ = sw.ReadByte()
	msg.PID, _ = sw.ReadUInt64()
	msg.Token, _ = sw.ReadStr()
	msg.SessState, _ = sw.ReadByte()

	return nil
}

// Size 获取长度
func (msg *ClientVerifyReq) Size() (n int) {
	return 1 + 8 + len(msg.Token) + 2 + 1
}

//////////////////////////////////////////////////////////////////////////////////////////

// ClientVerifySucceedRet 验证成功返回消息
type ClientVerifySucceedRet struct {
	// Source: 消息来源, 分客户端或者服务器(ClientMSG/服务器类型)
	Source uint8
	// UID: 客户端验证时返回UID
	PID uint64
	// SourceID: 验证成功消息的来源
	SourceID uint64
	// Type: 连接类型
	Type uint8
}

func (msg *ClientVerifySucceedRet) String() string {
	return fmt.Sprintf("%+v", *msg)
}

// Name 名字
func (msg *ClientVerifySucceedRet) Name() string {
	return "ClientVerifySucceedRet"
}

// MarshalTo 序列化
func (msg *ClientVerifySucceedRet) MarshalTo(data []byte) (n int, err error) {
	data[0] = byte(msg.Source)
	binary.LittleEndian.PutUint64(data[1:9], msg.PID)
	binary.LittleEndian.PutUint64(data[9:17], msg.SourceID)
	data[17] = byte(msg.Type)
	return msg.Size(), nil
}

// Unmarshal 反序列化
func (msg *ClientVerifySucceedRet) Unmarshal(data []byte) error {
	buf := bytes.NewReader(data)
	return binary.Read(buf, binary.LittleEndian, msg)
}

// Size 获取长度
func (msg *ClientVerifySucceedRet) Size() (n int) {
	return 18 //binary.Size(msg)
}

//////////////////////////////////////////////////////////////////////////////////////////

// ClientVerifyFailedRet 验证成功返回消息
type ClientVerifyFailedRet struct {
}

func (msg *ClientVerifyFailedRet) String() string {
	return fmt.Sprintf("%+v", *msg)
}

// Name 名字
func (msg *ClientVerifyFailedRet) Name() string {
	return "ClientVerifyFailedRet"
}

// MarshalTo 序列化
func (msg *ClientVerifyFailedRet) MarshalTo(data []byte) (n int, err error) {
	return msg.Size(), nil
}

// Unmarshal 反序列化
func (msg *ClientVerifyFailedRet) Unmarshal(data []byte) error {
	return nil
}

// Size 获取长度
func (msg *ClientVerifyFailedRet) Size() (n int) {
	return 0
}

// UserDuplicateLoginNotify 玩家重复登录通知
type UserDuplicateLoginNotify struct {
}

func (msg *UserDuplicateLoginNotify) String() string {
	return fmt.Sprintf("%+v", *msg)
}

// Name 名字
func (msg *UserDuplicateLoginNotify) Name() string {
	return "UserDuplicateLoginNotify"
}

// MarshalTo 序列化
func (msg *UserDuplicateLoginNotify) MarshalTo(data []byte) (n int, err error) {
	return msg.Size(), nil
}

// Unmarshal 反序列化
func (msg *UserDuplicateLoginNotify) Unmarshal(data []byte) error {
	return nil
}

// Size 获取长度
func (msg *UserDuplicateLoginNotify) Size() (n int) {
	return 0
}
